001 /* 002 * Copyright 2003-2005 The Apache Software Foundation 003 * Copyright 2005 Stephen McConnell 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package net.dpml.cli; 018 019 import java.util.Comparator; 020 import java.util.List; 021 import java.util.ListIterator; 022 import java.util.Set; 023 024 /** 025 * The super type of all options representing a particular element of the 026 * command line interface. 027 * 028 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 029 * @version 1.0.0 030 */ 031 public interface Option 032 { 033 /** 034 * Processes String arguments into a CommandLine. 035 * 036 * The iterator will initially point at the first argument to be processed 037 * and at the end of the method should point to the first argument not 038 * processed. This method MUST process at least one argument from the 039 * ListIterator. 040 * 041 * @param commandLine the CommandLine object to store results in 042 * @param args the arguments to process 043 * @throws OptionException if any problems occur 044 */ 045 void process( 046 final WriteableCommandLine commandLine, 047 final ListIterator args ) 048 throws OptionException; 049 050 /** 051 * Adds defaults to a CommandLine. 052 * 053 * Any defaults for this option are applied as well as the defaults for 054 * any contained options 055 * 056 * @param commandLine the CommandLine object to store defaults in 057 */ 058 void defaults( WriteableCommandLine commandLine ); 059 060 /** 061 * Indicates whether this Option will be able to process the particular 062 * argument. 063 * 064 * @param commandLine the CommandLine object to store defaults in 065 * @param argument the argument to be tested 066 * @return true if the argument can be processed by this Option 067 */ 068 boolean canProcess( WriteableCommandLine commandLine, String argument ); 069 070 /** 071 * Indicates whether this Option will be able to process the particular 072 * argument. The ListIterator must be restored to the initial state before 073 * returning the boolean. 074 * 075 * @see #canProcess(WriteableCommandLine,String) 076 * @param commandLine the CommandLine object to store defaults in 077 * @param arguments the ListIterator over String arguments 078 * @return true if the argument can be processed by this Option 079 */ 080 boolean canProcess( WriteableCommandLine commandLine, final ListIterator arguments ); 081 082 /** 083 * Identifies the argument prefixes that should trigger this option. This 084 * is used to decide which of many Options should be tried when processing 085 * a given argument string. 086 * 087 * The returned Set must not be null. 088 * 089 * @return The set of triggers for this Option 090 */ 091 Set getTriggers(); 092 093 /** 094 * Identifies the argument prefixes that should be considered options. This 095 * is used to identify whether a given string looks like an option or an 096 * argument value. Typically an option would return the set [--,-] while 097 * switches might offer [-,+]. 098 * 099 * The returned Set must not be null. 100 * 101 * @return The set of prefixes for this Option 102 */ 103 Set getPrefixes(); 104 105 /** 106 * Checks that the supplied CommandLine is valid with respect to this 107 * option. 108 * 109 * @param commandLine the CommandLine to check. 110 * @throws OptionException if the CommandLine is not valid. 111 */ 112 void validate( WriteableCommandLine commandLine ) throws OptionException; 113 114 /** 115 * Builds up a list of HelpLineImpl instances to be presented by HelpFormatter. 116 * 117 * @see HelpLine 118 * @see net.dpml.cli.util.HelpFormatter 119 * @param depth the initial indent depth 120 * @param helpSettings the HelpSettings that should be applied 121 * @param comp a comparator used to sort options when applicable. 122 * @return a List of HelpLineImpl objects 123 */ 124 List helpLines( int depth, Set helpSettings, Comparator comp ); 125 126 /** 127 * Appends usage information to the specified StringBuffer 128 * 129 * @param buffer the buffer to append to 130 * @param helpSettings a set of display settings @see DisplaySetting 131 * @param comp a comparator used to sort the Options 132 */ 133 void appendUsage( StringBuffer buffer, Set helpSettings, Comparator comp ); 134 135 /** 136 * The preferred name of an option is used for generating help and usage 137 * information. 138 * 139 * @return The preferred name of the option 140 */ 141 String getPreferredName(); 142 143 /** 144 * Returns a description of the option. This string is used to build help 145 * messages as in the HelpFormatter. 146 * 147 * @see net.dpml.cli.util.HelpFormatter 148 * @return a description of the option. 149 */ 150 String getDescription(); 151 152 /** 153 * Returns the id of the option. This can be used in a loop and switch 154 * construct: 155 * 156 * <code> 157 * for(Option o : cmd.getOptions()){ 158 * switch(o.getId()){ 159 * case POTENTIAL_OPTION: 160 * ... 161 * } 162 * } 163 * </code> 164 * 165 * The returned value is not guarenteed to be unique. 166 * 167 * @return the id of the option. 168 */ 169 int getId(); 170 171 /** 172 * Recursively searches for an option with the supplied trigger. 173 * 174 * @param trigger the trigger to search for. 175 * @return the matching option or null. 176 */ 177 Option findOption( String trigger ); 178 179 /** 180 * Indicates whether this option is required to be present. 181 * @return true if the CommandLine will be invalid without this Option 182 */ 183 boolean isRequired(); 184 }